package main

import "fmt"

func main() {
	// goto
	// gotoFunc()

	// break 处理提前跳出某个循环
	for i := 0; i < 10; i++ {
		if i > 6 {
			break
		}
		fmt.Println(i) // 在这里只打印 0-6
	}

	fmt.Println("-------------------")

	// 不使用标签的话，和使用 continue 一样，只跳出内部循环
	for outerIndex := 0; outerIndex < 10; outerIndex++ {
		for innerIndex := 0; innerIndex < 6; innerIndex++ {
			fmt.Println(outerIndex, innerIndex) // 打印 0 0，1 0，2 0，... ，10 0
			break
		}
	}

	// 使用标签的话，会跳出全部循环，不管几层
	// 定义一个标签 FORBREAK，使 双层循环只输出一次外部循环的结果
FORBREAK:
	for outerIndex := 0; outerIndex < 10; outerIndex++ {
		for innerIndex := 0; innerIndex < 6; innerIndex++ {
			fmt.Println(outerIndex, innerIndex) // 只打印 0 0
			break FORBREAK
		}
	}

	fmt.Println("-------------------")

	// continue
	for outerIndex := 0; outerIndex < 3; outerIndex++ {
		for innerIndex := 0; innerIndex < 2; innerIndex++ {
			fmt.Println(outerIndex, innerIndex) // 会完整打印
			continue
			// 虽然这里的循环不会额外中止，但是后面的代码会忽略
		}
	}
	fmt.Println("-------------------")
	// 定义一个标签 FORCONTINUE，使 双层循环只输出外部循环的结果
FORCONTINUE:
	for outerIndex := 0; outerIndex < 3; outerIndex++ {
		for innerIndex := 0; innerIndex < 2; innerIndex++ {
			fmt.Println(outerIndex, innerIndex) // 会打印 0 0, 1 0, 2 0
			continue FORCONTINUE
			// 虽然这里的循环不会额外中止，但是后面的代码会忽略
		}
	}
}

func gotoFunc() {
	myVariable := 0

	// 定义一个 GOTO 标签，里面定义一个死循环
GOTO:
	fmt.Println(myVariable)
	myVariable++
	// 使用 goto + 标签 进行跳转
	goto GOTO
}
